<!--
 The BSD 3-Clause License

 Copyright 2022 - DATATRONiQ GmbH (https://datatroniq.com)
 Copyright (c) 2018-2022 Klaus Landsdorf (http://node-red.plus/)
 Copyright 2015,2016 - Mika Karaila, Valmet Automation Inc. (node-red-contrib-opcua)
 All rights reserved.
 node-red-contrib-iiot-opcua
-->

<script type="text/javascript">
  RED.nodes.registerType('OPCUA-IIoT-Listener', {
    category: 'IIoT',
    color: '#ABCDEF',
    defaults: {
      connector: {type: 'OPCUA-IIoT-Connector', required: true},
      action: {value: 'subscribe', required: true},
      queueSize: {value: 10, required: true, validate: RED.validators.number()},
      name: {value: ''},
      topic: {value: ''},
      justValue: {value: true},
      useGroupItems: {value: false},
      showStatusActivities: {value: false},
      showErrors: {value: false}
    },
    inputs: 1,
    outputs: 1,
    align: 'left',
    icon: 'icon.png',
    label: function () {
      return this.name || 'Listener'
    },
    labelStyle: function () {
      return this.name ? 'node_label_italic' : ''
    }
  })
</script>

<script type="text/x-red" data-template-name="OPCUA-IIoT-Listener">
    <div class="form-row">
        <label for="node-input-connector"><i class="icon-globe"></i> <span data-i18n="opcua-iiot-contrib.label.connector"></span></label>
        <input type="text" id="node-input-connector" placeholder="opc.tcp://localhost:4334">
    </div>
     <div class="form-row">
        <label for="node-input-action"><i class="fa fa-list"></i> <span data-i18n="opcua-iiot-contrib.label.actiontype"></span></label>
        <select type="text" id="node-input-action" style="width:72%;">
            <option value="subscribe" selected>Monitoring</option>
            <option value="events">Alarm&amp;Events</option>
        </select>
    </div>
    <div class="form-row">
        <label for="node-input-queueSize"><i class="icon-list"></i> <span data-i18n="opcua-iiot-contrib.label.queueSize"></span></label>
        <input type="number" id="node-input-queueSize" placeholder="">
    </div>
    <div class="form-row">
        <label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="node-red:common.label.name"></span></label>
        <input type="text" id="node-input-name" placeholder="">
    </div>
    <div class="form-row">
        <label for="node-input-topic"><i class="fa fa-tag"></i> <span data-i18n="node-red:common.label.topic"></span></label>
        <input type="text" id="node-input-topic">
    </div>
    <hr>
    <div class="form-row">
        <label style="min-width:160px" for="node-input-useGroupItems"><i class="fa fa-object-group"></i>
        <span data-i18n="opcua-iiot-contrib.label.useGroupItems"></span></label>
        <input type="checkbox" id="node-input-useGroupItems" style="max-width:30px">
    </div>
    <div class="form-row">
        <label style="min-width:160px" for="node-input-justValue"><i class="fa fa-simplybuilt"></i>
        <span data-i18n="opcua-iiot-contrib.label.justValue"></span></label>
        <input type="checkbox" id="node-input-justValue" style="max-width:30px">
    </div>
    <hr>
    <div class="form-row">
        <label style="min-width:160px" for="node-input-showStatusActivities"><i class="fa fa-bolt"></i>
        <span data-i18n="opcua-iiot-contrib.label.showActivities"></span></label>
        <input type="checkbox" id="node-input-showStatusActivities" style="max-width:30px">
    </div>
    <div class="form-row">
        <label style="min-width:160px" for="node-input-showErrors"><i class="fa fa-exclamation-circle"></i>
        <span data-i18n="opcua-iiot-contrib.label.showErrors"></span></label>
        <input type="checkbox" id="node-input-showErrors" style="max-width:30px">
    </div>

</script>

<script type="text/x-red" data-help-name="OPCUA-IIoT-Listener">
    <h2>OPC UA IIoT Listener</h2>

    <p>The Listener node is to set up monitoring to the address space or
    Alarm&amp;Events of your OPC UA server.
    It needs only one inject to set up start monitoring. For every inject, it
    works like flip-flop - subscribe-unsubscribe monitoring or Alarm&amp;Events.</p>

    <h3>Input</h3>
    <div>
        <strong>Input:</strong>
        <ul>
            <li>payload (number*/Object)
            <ul>
                <li>interval (number*)
                <li>queueSize (number)
                <li>options (Object)
            </ul>
            <li>topic
            <li>nodetype (inject)
            <li>injectType (listen/browse*)
            <li>addressSpaceItems or addressItemsToRead* (Array of Objects)
        </ul>
    </div>

    <h4>Inject payload JSON</h4>
    <p>There is an option to send a JSON payload inject into the Listener.</p>
    <p>Example:</p>
    <p><pre>
      {
        "interval": 500,
        "queueSize": 10,
        "options": {
            "requestedPublishingInterval": 5000,
            "requestedLifetimeCount": 60,
            "requestedMaxKeepAliveCount": 10,
            "maxNotificationsPerPublish": 5,
            "publishingEnabled": true,
            "priority": 8
      }
    }
    </pre></p>

    <p>The option interval means the sampling interval. If you want to set the publishing interval you have to send a bit more options.</p>

    <div>
        <h5>msg.payload.options<h5>

        <strong>event subscription parameters default:</stong>
        <pre>
        msg.payload.options = {
            requestedPublishingInterval: 100,
            requestedLifetimeCount: 60,
            requestedMaxKeepAliveCount: 10,
            maxNotificationsPerPublish: 4,
            publishingEnabled: true,
            priority: 3
        }
        </pre>

        <strong>subscription parameters default:</stong>
        <pre>
        msg.payload.options = {
            requestedPublishingInterval: 100,
            requestedLifetimeCount: 1000,
            requestedMaxKeepAliveCount: 12,
            maxNotificationsPerPublish: 100,
            publishingEnabled: true,
            priority: 6
        }
        </pre>
    </div>

    <p>The sampling interval and the publishing interval is to tell you want to sample every n interval in msec. and it should publish every n msec.</p>
    <p>Example: interval: 200, queueSize: 5, and requestedPublishingInterval: 1000 samples every 200 msec. and publishing changes every second (1000 msec.) with max. 5 values</p>

    <h3>Output 1</h3>

    <h4>All Mode</h4>
    <div>
        <strong>Result in message:</strong>
        <ul>
            <li>payload (object)
            <li>topic
            <li>addressSpaceItems (Array)
            <li>nodetype
            <li>injectType
            <li>readtype
            <li>result (origin from node-opcua)
            <li>mode (all/value)
        </ul>
    </div>

    <h4>Value Mode</h4>
    <div>
        <strong>Result in subscribe message:</strong>
        <ul>
            <li>payload
            <ul>
                <li>name
                <li>nodeId
                <li>value
            </ul>
            <li>topic
            <li>addressSpaceItems (Array)
            <li>injectType
            <li>readtype
            <li>mode (all/value)
        </ul>
    </div>

    <h3>Output 2</h3>
    <p>That output provides the origin from node-opcua as JSON.</p>

    <strong>Name</strong>
    <p>Name in the flow of Node-RED.</p>

    <p>Set showErrors to get errors from node-opcua on browse.</p>
</script>
